home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Everything For A Hacker
/
19990506-[HACK].iso
/
HEXEDIT
/
UTILS
/
80X0393.ARJ
/
CPRINT.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-03-30
|
4KB
|
131 lines
;
; cprint.asm by Rich Paul
;
; This is a direct video color printing routine.
; Use in mode three (co80). It's kinda nice.
;
.model small
.code
.286
extrn scroll:far
public cprint
;-----------------------------------------------------------------------------
; Color Printing Routine -- Direct Video Version -- Use in mode 3
; or at your own risk
;
; Calling conventions: DS:SI - string to print
; DX - location, or FFFF for currant cursor pos
; String: Z-Term, 255 preceeds attribute
; Return: DX - ending cursor pos
; if called with 0 in DX, sets new cursor pos as well
cprint proc far
push es ; save ES first, to use as temp
pusha ; save the regs
push dx ; and an extra DX for return
mov ax,0b800h ; set the ES to screen
mov es,ax
cmp dx,0FFFFH ; if =, use current bois pos
jne sent ; otherwise, it came with control
mov ah,3 ; Lookin' for the cursor pos.
mov bx,0 ; For the currant page
int 10h ; OK, so gotta use a bois routine
sent:
push dx ; Save the full position
shr dx,8 ; and set DX to the row #
mov ax,160 ; ax is # of bytes/row
mul dl ; * rows is offset of first byte of row
pop dx
add al,dl ; set to 1/2 offset of column
add al,dl ; set to offset of column
mov di,ax
mov bl,es:[di+1] ; get currant attribute
printl:
lodsb
cmp al,0
je printld
cmp al,255 ; is this attribute flag?
jne printl2 ; nope, print it
lodsb ; get the attribute
mov bl,al ; save the attribute
jmp printl ; and continue
printl2:
cmp al,13 ; how 'bout <CR>?
je docr
cmp al,10 ; and <LF>?
je dolf
inc dl
cmp dl,51h
jne printl4
xor dl,dl
inc dh
cmp dh,19h
jne printl3
dec dh
call scroll
sub di,160
printl3:
printl4:
stosb
mov al,bl
stosb
jmp printl
printld:
mov es,dx ; save the cursor pos in es
pop dx ; restore extra DX
cmp dx,0FFFFH ; was it called to print at current position?
jne sent2 ; if NOT, skip setting
mov dx,es ; get pos back
mov ah,02 ; service to set
xor bh,bh ; zero bx
int 10h ; and set new cursor pos
sent2:
popa
mov dx,es ; return the cursor pos
pop es
ret
docr:
push ax
push cx
mov ax,di
mov cl,160
div cl
shr ax,8 ; move remainder to AX (from ah)
neg ax
add ax,di
mov di,ax ; set marker to start of currant line
xor dl,dl ; set column to 0
pop cx
pop ax
jmp printl
dolf:
inc dh ; next line
cmp dh,19h ; off the edge?
jne dolf2
dec dh
call scroll
jmp printl
dolf2:
add di,160 ; move to same pos on next line
jmp printl
cprint endp
end